package main

import (
	"bytes"
	"context"
	"fmt"
	"gitee.com/sillyman/mixlog"
	"io/ioutil"
	"strings"
	"text/template"
	"time"
)

//vlcStartTransmit
func vlcStartTransmit(ctx context.Context) (streams []string) {
	var (
		m3u8FileBuf   = bytes.NewBufferString("#EXTM3U\n#EXT-X-ALLOW-CACHE:NO")
		m3u8ItemTempl = template.Must(template.New("m3u8_item").Parse("\n#EXTINF:0,{{.title}}\n#EXTVLCOPT:network-caching=1000\n{{.url}}"))

		//videoFilesLen 电影文件的数量
		videoFilesLen = len(Conf.VideoFiles)
	)

	for i, dAddr := range Conf.RTPStreamAddresses {
		//目标地址和端口
		var dIP, dPort string
		ipAndPort := strings.SplitAfterN(dAddr, ":", -1)
		if len(ipAndPort) >= 2 {
			dIP, dPort = strings.TrimRight(strings.Join(ipAndPort[0:len(ipAndPort)-1], ""), ":"), ipAndPort[len(ipAndPort)-1]
		}
		if dIP == "" || dPort == "" {
			mixlog.Warningf("跳过一个地址，因为此地址不正确: %s", dAddr)
			continue
		}

		//视频文件
		videoFile := Conf.VideoFiles[i%videoFilesLen]

		//播放
		go func(dIP, dPort, videoFile string) {
			cmd, err := vlcPlay(ctx, dIP, dPort, videoFile)
			if err != nil {
				mixlog.Errorf("错误发生在创建VLC命令: %s", err.Error())
				return
			}
			if cmd == nil {
				mixlog.Errorf("exec 对象为 nil")
				return
			}
			mixlog.Debugf("启动VLC的命令: %s", cmd.String())

			if err := cmd.Start(); err != nil {
				mixlog.Errorf("错误发生在播放 %s 文件到 %s:%s 流: %s", videoFile, dIP, dPort, err.Error())
				return
			}

			//VLC播放列表的项目
			theRTPStream := fmt.Sprintf("rtp://@%s:%s", dIP, dPort)
			streams = append(streams, theRTPStream)
			_ = m3u8ItemTempl.Execute(m3u8FileBuf, map[string]string{
				"title": videoFile,
				"url":   theRTPStream,
			})

			mixlog.Infof("播放 %s 文件到 %s:%s 流", videoFile, dIP, dPort)
			_ = cmd.Wait()
		}(dIP, dPort, videoFile)

		time.Sleep(time.Second)
	}

	//写入播放列表文件
	if err := ioutil.WriteFile("vlc_videos_list.m3u8", m3u8FileBuf.Bytes(), 0644); err != nil {
		mixlog.Errorf("写 VLC 播放列表文件失败: %s", err.Error())
	}
	mixlog.Info("已生成 VLC 播放列表文件 vlc_videos_list.m3u8，请放到客户端播放它")

	time.Sleep(time.Second)
	return streams
}
